¿Necesitas pandas?

  • ¿Necesitas importar datos a Python?
  • ¿Los datos no están limpios?
  • ¿Necesitas explorar los datos y aumentar tu conocimiento sobre los mismos de forma rápida y simple?
  • ¿Necesitas procesar tus datos y prepararlos para análisis posteriores con statsmodels, scikit-learn,..., otros?
  • ¿...?

Si respondes afirmativamente a cualquiera de las anteriores preguntas y no tienes mucha idea sobre pandas estás en el sitio adecuado...

¿Qué es pandas?

Para cualquier trabajo intensivo de datos pandas se ha convertido en la librería esencial dentro del mundo Python.

Se podría ver a pandas como numpy arrays con esteroides, esto es, numpy arrays con etiquetas para columnas y filas y soporte mejorado para trabajo con datos heterogéneos.

Pero lo anterior es una definición un tanto superficial. El diablo está en los detalles!!!

Características interesantes:

  • Entrada/Salida para un montón de formatos de datos diferentes de forma rápida, simple y flexible (csv, json, sql, HDF5, HTML,...).
  • Herramientas para trabajar con datos missing (.dropna(), pd.isnull()).
  • Unión y combinación (concat, join, merge).
  • Agrupamiento: funcionalidad groupby.
  • Reshaping (stack, unstack, pivot, pivot_table).
  • Potente manipulación de series de datos (resampling, timezones, ...).
  • Graficado sencillo.

¿Qué vamos a ver?

  • Tipos de estructuras de datos con pandas.
  • Lectura/escritura de datos.
  • Obtener información de la estructura de datos, algunas operaciones estadísticas, establecimiento de los índices, trabajo con valores perdidos/no disponibles. Trabajo con fechas.
  • Selección e indexación de datos.
  • Trabajo con datos perdidos, no disponibles,...
  • Combinación, agrupamiento, agregación,...
  • Graficado de resultados.

Qué necesitamos para el tutorial


In [ ]:
# primero hacemos los imports de turno
import os
import datetime as dt
import sys

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from IPython.display import display

np.random.seed(19760812)
plt.style.use('bmh')
%matplotlib inline

In [ ]:
print('Python version:')
print(sys.version)
print()
print('Pandas: ', pd.__version__)
print('Numpy: ', np.__version__)
print('Matplotlib: ', mpl.__version__)

Análisis preliminar de unos datos de viento

Antes de ver nada sobre pandas vamos a hacer un pequeño análisis de unos datos de viento para que veamos algunas de las capacidades de la librería.


In [ ]:
# Leemos los datos del fichero 'model.txt'
ipath = os.path.join('Datos', 'model.txt')

model = pd.read_csv(ipath, sep = "\s*", skiprows = 3,
                    parse_dates = {'Timestamp': [0, 1]}, index_col = 'Timestamp')

In [ ]:
model.head()

In [ ]:
pd.tools.plotting.scatter_matrix(model.ix[0:1000, 'M(m/s)':'D(deg)'])

In [ ]:
print(model.index[0], model.index[-1], sep = '\n')

In [ ]:
model.mean()

In [ ]:
model.max()

In [ ]:
idx = model.loc[:, 'M(m/s)'].sort_values(ascending = False).index

In [ ]:
pd.tools.plotting.scatter_matrix(model.loc[idx[:1000], 'M(m/s)':'D(deg)'])

In [ ]:
model.loc[:, 'M(m/s)'].plot.hist(bins = np.arange(0, 35))

In [ ]:
model['month'] = model.index.month
model['year'] = model.index.year

In [ ]:
model.groupby(by = ['year', 'month']).mean().plot(y = 'M(m/s)', figsize = (15, 5))

In [ ]:
monthly = model.groupby(by = ['year', 'month']).mean()
monthly['ma'] = monthly.loc[:, 'M(m/s)'].rolling(5, center = True).mean()
monthly.head()

In [ ]:
monthly.loc[:,['M(m/s)', 'ma']].plot(figsize = (15, 6))

In [ ]:
monthly.loc[:, 'M(m/s)'].reset_index().pivot(index = 'year', columns = 'month')

In [ ]:
(monthly.loc[:, 'M(m/s)'].reset_index().pivot(
    index = 'year', 
        columns = 'month'
    ).T.plot(
        figsize = (15, 10), 
        legend = False
    )
 )